import tkinter as tk
from tkinter import messagebox
import tkinter.font as tkFont
import markdown2
from tkinterweb import HtmlFrame  


class CustomDialog:
    def __init__(self, parent, title, message, type='info'):
        self.parent = parent
        self.message = message  # 保存原始消息用于复制

        # 创建对话框窗口
        dialog = tk.Toplevel(parent)
        dialog.title(title)

        # 屏幕居中显示
        screen_width = dialog.winfo_screenwidth()
        screen_height = dialog.winfo_screenheight()
        window_width, window_height = 1200, 700
        x = (screen_width / 2) - (window_width / 2)
        y = (screen_height / 2) - (window_height / 2)
        dialog.geometry(f"{window_width}x{window_height}+{int(x)}+{int(y)}")

        # 字体定义
        text_font = ('微软雅黑', 12)
        button_font = ('微软雅黑', 14, 'bold')

        # 设置默认背景色
        default_bg = dialog.cget("bg")

        # 创建Frame用于文本区域和滚动条
        frame = tk.Frame(dialog)
        frame.pack(padx=10, pady=10, fill=tk.BOTH, expand=True)

        # Markdown文本区域
        html_text = markdown2.markdown(message)

        # 替换为 HtmlFrame，支持文本选择
        html_frame = HtmlFrame(frame, messages_enabled=False)  # 可选关闭调试信息
        html_frame.load_html(html_text)
        html_frame.add_css("body { font-family: 'SimSun', serif; background-color: %s; padding: 10px; }" % default_bg)
        html_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)

        # 按钮框架
        button_frame = tk.Frame(dialog)
        button_frame.pack(pady=10, side=tk.BOTTOM)

        # 确定按钮
        close_button = tk.Button(button_frame, text="确定", command=dialog.destroy, font=button_font)
        close_button.pack(side=tk.LEFT,padx=30)

        # 复制按钮 
        copy_button = tk.Button(
            button_frame, 
            text="复制", 
            command=lambda: self.copy_to_clipboard(dialog),  # 绑定复制方法
            font=button_font
        )
        copy_button.pack(side=tk.LEFT, padx=30)  # 放在确定按钮右侧

        # 设置为 transient 窗口并捕获输入焦点
        dialog.transient(parent)
        dialog.grab_set()
        parent.wait_window(dialog)

    def copy_to_clipboard(self, dialog):
        """
        将消息内容复制到系统剪贴板
        并显示操作成功提示（5秒后自动消失）
        
        参数:
            dialog (Toplevel): 对话框窗口实例
        """
        try:
            # 清除剪贴板并写入内容
            dialog.clipboard_clear()
            dialog.clipboard_append(self.message)
            
            # 创建自动消失的提示窗口
            toast = tk.Toplevel(dialog)
            toast.overrideredirect(True)  # 移除窗口边框
            toast.geometry("300x60")
            toast.configure(bg="#4CAF50")  # 绿色背景
            
            # 计算提示窗口位置（居中于父窗口）
            x = dialog.winfo_x() + (dialog.winfo_width() // 2) - 150
            y = dialog.winfo_y() + (dialog.winfo_height() // 2) - 30
            toast.geometry(f"+{x}+{y}")
            
            # 添加提示文本
            label = tk.Label(
                toast, 
                text="内容已复制到粘贴板 √", 
                bg="#4CAF50", 
                fg="white", 
                font=("微软雅黑", 12)
            )
            label.pack(expand=True, fill=tk.BOTH, padx=10, pady=10)
            
            # 2秒后自动关闭提示
            toast.after(2000, toast.destroy)
            
        except Exception as e:
            # 异常处理保持原样
            messagebox.showerror(
                "复制失败", 
                f"复制操作出错: {str(e)}",
                parent=dialog
            )
def show_custom_dialog():
    # 显示自定义对话框
    CustomDialog(root, "提示", "## 这是一个使用 CustomDialog 显示的提示信息。你可以滚动查看长文本内容。\n ***注意：** n\n1. 滚动查看长文本内容。\n2. 点击确定按钮关闭对话框。\n3. 点击窗口外部或按ESC键关闭对话框。\n4. 点击窗口标题栏的关闭按钮关闭对话框。\n5. 点击窗口标题栏的X按钮关闭对话框。\n6. 点击窗口标题栏的问号图标显示帮助信息。\n7. 点击窗口标题栏的" )


if __name__ == "__main__":
    # 创建主窗口
    root = tk.Tk()
    root.title("CustomDialog 调用示例")
    root.geometry("400x300")

    # 添加一个按钮用于触发对话框
    btn = tk.Button(root, text="显示提示框", font=("微软雅黑", 14), command=show_custom_dialog)
    btn.pack(pady=50)

    # 运行主循环
    root.mainloop()